今日課程範圍
SQL Lesson 3: Queries with constraints (Pt. 2)
https://sqlbolt.com/lesson/select_queries_with_constraints_pt_2
今天我們來學習一個好用的SQL語法GROUP BY
& HAVING
當我們想要對以某個項目進行分組 並在分組後再以特定條件進行篩選要如何進行呢?
例如班級躲避球賽 先亂數拆成兩隊 並找出各隊最高的人出來猜拳決定誰先攻
這種先分組再進行條件的限制 便是GROUP BY
& HAVING
派上用場的地方
想必你一定很好奇 我們先前不是學過可以使用WHERE
來進行條件的篩選嗎?
那為什麼這邊要用HAVING
而不用 WHERE
呢?
我們想像一下 亂數拆隊就表示這個是臨時的 並非真正的編制
因此在原始編制的資料中並不實際存在
WHERE
無法使用在這個由GROUP BY
產生的臨時分組數據上
因此就需要用HAVING
語法來進行條件限制
我們實際來練習看看吧
第一題我們要找出所有Artists的人數
並且限制我們不要使用HAVING的寫法
我們可以使用WHERE
來限制條件(Role = "Artist")
然後用COUNT()來計算人數
SELECT Role, COUNT(name) AS "Number of Artists" FROM employees
WHERE Role = "Artist"
第二題我們要找出各個Role的人數
因此我們可以使用 GROUP BY
先進行分組
再計算各組的人數即可
SELECT Role,Building,COUNT(name) AS "number of Employees"
FROM employees
GROUP BY Role
第三題稍微複雜一點點
我們要找出Role為工程師的人,與這些人的合計年資
因此 我們一樣先使用GROUP BY
進行分組
然後使用HAVING
加入限制條件
最後再計算合計的總年資
SELECT Role,Building,SUM(Years_employed
) AS "total number of years employed" FROM employees
GROUP BY Role
HAVING Role = "Engineer"
今天的練習先到這邊GROUP BY
是個相當好用的語法
對於我們在對資料進行分組上有很大的用處
我們明天再繼續